package webhook

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"log"

	"gitee.com/daofeixian/dfx_golang_toolset/sendmsg"
	"gitee.com/daofeixian/dfx_golang_toolset/utils"
)

// 常量定义
const (
	WeChatMsgTypeText         = "text"
	WeChatMsgTypeMarkdown     = "markdown"
	WeChatMsgTypeMarkdownV2   = "markdown_v2"
	WeChatMsgTypeTemplateCard = "template_card"
	WeChatContentTypeJSON     = "application/json"
)

// WeChatWebhook 是企业微信 Webhook 的客户端结构体，用于发送消息到企业微信群聊。
type WeChatWebhook struct{}

// SendMsg 向企业微信发送消息。
// 参数:
//   - sendinfo: 包含发送信息的结构体指针，包括消息类型、内容、模板、手机号列表和目标URL等。
//
// 返回值:
//   - error: 如果发送过程中出现错误，则返回相应的错误信息；否则返回 nil。
func (w *WeChatWebhook) SendMsg(ctx context.Context, sendinfo *sendmsg.SendInfo) error {
	// 检查传入的消息信息是否为空
	if sendinfo == nil {
		return fmt.Errorf("发送信息不能为空")
	}

	// 设置请求头
	headers := map[string]interface{}{
		"Content-Type": WeChatContentTypeJSON,
	}

	var jsonBody []byte
	var err error

	// 根据消息类型构造不同的消息体并序列化为 JSON
	switch sendinfo.MsgType {
	case WeChatMsgTypeText:
		msg := NewWeChatWebhookTextMsg(sendinfo.Msg, sendinfo.Template, sendinfo.PhoneNumbers)
		jsonBody, err = json.Marshal(msg)
	case WeChatMsgTypeMarkdown:
		msg := NewWeChatWebhookMarkdownMsgV2(sendinfo.Msg, sendinfo.Template)
		jsonBody, err = json.Marshal(msg)
	case WeChatMsgTypeTemplateCard:
		return fmt.Errorf("模板卡片消息类型暂未实现")
	default:
		return fmt.Errorf("不支持的消息类型: %s", sendinfo.MsgType)
	}

	// 处理消息序列化错误
	if err != nil {
		return fmt.Errorf("消息序列化失败: %w", err)
	}

	// 打印请求日志
	log.Printf("WeChat webhook request: %s", string(jsonBody))

	// 发送 HTTP 请求
	resqBody, err := utils.HttpDo(ctx, sendinfo.Url, "POST", bytes.NewReader(jsonBody), headers)
	if err != nil {
		return fmt.Errorf("发送请求失败: %w", err)
	}

	// 打印响应日志
	log.Printf("WeChat webhook response: %s", string(resqBody))
	return nil
}

// WeChatWebhookTextMsg 表示企业微信文本消息的结构体。
type WeChatWebhookTextMsg struct {
	MsgType string                 `json:"msgtype"` // 消息类型，固定为 "text"
	Text    map[string]interface{} `json:"text"`    // 文本消息内容
}

// NewWeChatWebhookTextMsg 创建一个新的企业微信文本消息实例。
// 参数:
//   - content: 消息原始内容。
//   - temptext: 模板文本，用于格式化消息内容。
//   - mobile: 需要@的手机号列表。
//
// 返回值:
//   - *WeChatWebhookTextMsg: 构造好的文本消息结构体指针。
func NewWeChatWebhookTextMsg(content, temptext string, mobile []string) *WeChatWebhookTextMsg {
	// 使用模板处理消息内容
	content = JsonDataToTemplate(content, temptext)
	if content == "" || content == WebhookFailureMsg {
		content = WebhookFailureMsg
	}

	// 构造文本内容
	text := map[string]interface{}{
		"content": content,
	}

	// 如果有手机号列表，则添加提及列表
	if len(mobile) > 0 {
		text["mentioned_mobile_list"] = mobile
	}

	return &WeChatWebhookTextMsg{
		MsgType: WeChatMsgTypeText,
		Text:    text,
	}
}

// WeChatWebhookMarkdownMsg 表示企业微信 Markdown 消息的结构体。
type WeChatWebhookMarkdownMsg struct {
	MsgType  string            `json:"msgtype"`  // 消息类型，固定为 "markdown"
	Markdown map[string]string `json:"markdown"` // Markdown 消息内容
}

// NewWeChatWebhookMarkdownMsg 创建一个新的企业微信 Markdown 消息实例。
// 参数:
//   - content: 消息原始内容。
//   - temptext: 模板文本，用于格式化消息内容。
//
// 返回值:
//   - *WeChatWebhookMarkdownMsg: 构造好的 Markdown 消息结构体指针。
func NewWeChatWebhookMarkdownMsg(content, temptext string) *WeChatWebhookMarkdownMsg {
	// 使用模板处理消息内容
	content = JsonDataToTemplate(content, temptext)
	if content == "" || content == WebhookFailureMsg {
		content = WebhookFailureMsg
	}

	return &WeChatWebhookMarkdownMsg{
		MsgType: WeChatMsgTypeMarkdown,
		Markdown: map[string]string{
			"content": content,
		},
	}
}

// WeChatWebhookMarkdownMsgV2 表示企业微信 Markdown V2 消息的结构体。
type WeChatWebhookMarkdownMsgV2 struct {
	MsgType  string            `json:"msgtype"`     // 消息类型，固定为 "markdown_v2"
	Markdown map[string]string `json:"markdown_v2"` // Markdown V2 消息内容
}

// NewWeChatWebhookMarkdownMsgV2 创建一个新的企业微信 Markdown V2 消息实例。
// 参数:
//   - content: 消息原始内容。
//   - temptext: 模板文本，用于格式化消息内容。
//
// 返回值:
//   - *WeChatWebhookMarkdownMsgV2: 构造好的 Markdown V2 消息结构体指针。
func NewWeChatWebhookMarkdownMsgV2(content, temptext string) *WeChatWebhookMarkdownMsgV2 {
	// 使用模板处理消息内容
	content = JsonDataToTemplate(content, temptext)
	if content == "" || content == WebhookFailureMsg {
		content = WebhookFailureMsg
	}

	return &WeChatWebhookMarkdownMsgV2{
		MsgType: WeChatMsgTypeMarkdownV2,
		Markdown: map[string]string{
			"content": content,
		},
	}
}

// WeChatWebHookTemplateCardMsg 表示企业微信模板卡片消息的结构体。
type WeChatWebHookTemplateCardMsg struct {
	MsgType      string       `json:"msgtype"`       // 消息类型，固定为 "template_card"
	TemplateCard TemplateCard `json:"template_card"` // 模板卡片内容
}

// TemplateCardSource 表示模板卡片的来源信息。
type TemplateCardSource struct {
	IconURL   string `json:"icon_url"`   // 图标 URL
	Desc      string `json:"desc"`       // 描述文字
	DescColor int    `json:"desc_color"` // 描述文字颜色
}

// TemplateCardMainTitle 表示模板卡片的主标题。
type TemplateCardMainTitle struct {
	Title string `json:"title"` // 主标题
	Desc  string `json:"desc"`  // 副标题或描述
}

// TemplateCardEmphasisContent 表示模板卡片中的强调内容。
type TemplateCardEmphasisContent struct {
	Title string `json:"title"` // 强调标题
	Desc  string `json:"desc"`  // 强调描述
}

// TemplateCardQuoteArea 表示模板卡片中的引用区域。
type TemplateCardQuoteArea struct {
	Type      int    `json:"type"`       // 引用类型
	URL       string `json:"url"`        // 引用链接
	Appid     string `json:"appid"`      // 小程序 AppID
	Pagepath  string `json:"pagepath"`   // 小程序页面路径
	Title     string `json:"title"`      // 引用标题
	QuoteText string `json:"quote_text"` // 引用文字
}

// TemplateCardHorizontalContentList 表示模板卡片中的水平内容列表项。
type TemplateCardHorizontalContentList struct {
	Keyname string `json:"keyname"`            // 键名
	Value   string `json:"value"`              // 值
	Type    int    `json:"type,omitempty"`     // 类型（可选）
	URL     string `json:"url,omitempty"`      // 链接（可选）
	MediaID string `json:"media_id,omitempty"` // 媒体 ID（可选）
}

// TemplateCardJumpList 表示模板卡片中的跳转链接列表项。
type TemplateCardJumpList struct {
	Type     int    `json:"type"`               // 跳转类型
	URL      string `json:"url,omitempty"`      // 跳转链接（可选）
	Title    string `json:"title"`              // 跳转标题
	Appid    string `json:"appid,omitempty"`    // 小程序 AppID（可选）
	Pagepath string `json:"pagepath,omitempty"` // 小程序页面路径（可选）
}

// TemplateCardAction 表示模板卡片的整体操作按钮。
type TemplateCardAction struct {
	Type     int    `json:"type"`     // 操作类型
	URL      string `json:"url"`      // 操作链接
	Appid    string `json:"appid"`    // 小程序 AppID
	Pagepath string `json:"pagepath"` // 小程序页面路径
}

// TemplateCard 表示完整的模板卡片结构。
type TemplateCard struct {
	CardType              string                              `json:"card_type"`               // 卡片类型
	Source                TemplateCardSource                  `json:"source"`                  // 来源信息
	MainTitle             TemplateCardMainTitle               `json:"main_title"`              // 主标题
	EmphasisContent       TemplateCardEmphasisContent         `json:"emphasis_content"`        // 强调内容
	QuoteArea             TemplateCardQuoteArea               `json:"quote_area"`              // 引用区域
	SubTitleText          string                              `json:"sub_title_text"`          // 子标题文本
	HorizontalContentList []TemplateCardHorizontalContentList `json:"horizontal_content_list"` // 水平内容列表
	JumpList              []TemplateCardJumpList              `json:"jump_list"`               // 跳转链接列表
	CardAction            TemplateCardAction                  `json:"card_action"`             // 卡片操作
}
